perm filename VERT.F4[NEW,LCS] blob
sn#717317 filedate 1983-06-18 generic text, type T, neo UTF8
C VERT.F4, JUSTAV, ORDER, ST1000, STAFFN, STFH, VERTX, SETP8, EXPND
SUBROUTINE VERT
C****** ALWAYS ASSUMES THERE REALLY IS A STAFF 0 **********
C ALWAYS ASSUMES BOTTOM STAFF IS STAFF #0
COMMON/XRN/ RN(1)/PTR/KWDS(1) /STF/RSTFAC(120),STFF(120)
CC COMMON R2,JA,CENTR,J2,R3 /ALFF/INP(1),J0,K0,RL,R4,R5,X,Y,NX
COMMON R2,JA,CN,J2,R3,R4,R5,R6,R7,R8,R9
COMMON /JCHAR/IXX,ISEMI,IBLA /LIMIT/LIMIT,ITEM
1 /ALFF/INP(1),J0,K0,RL,Q4,Q5,X,Y,NX
1 ,RN2,RN4,RN5,RSET,JX,JH,RH,NN,KK,JHX,ISTF(0/7)
1 /RXP/RINP(8),K,SST(8),J,INX,RRT,A,Z,JJ,MX,H(8)
C NFILE HOLDS POINTERS TO START OF EACH FILE IN KWDS ARRAY
COMMON /NFI/NFILE(1) /RR4/P1,P2,NFCNT
CC COMMON /NFI/NFILE(1) /RR4/X4,X5,P1,P2,IH,NFCNT
C FIRST FIND OUT WHAT THE CURRENT HEIGHT IS BY DOING 'JV 1'
NL=0
XX=0
NF=2
NA=1
NB=NFILE(2)
DO 1 K=1,ITEM-1
IF(K.NE.NB)GO TO 4
C NOW UPDATE NA,NB TO SET LIMITS OF AN INPUT FILE
NF=NF+1
NA=NB
NB=NFILE(NF)
4 L=KWDS(K)
IF(RN(L+1).NE.8.)GO TO 1
IF(STAFFN(L).NE.0)GO TO 1
RH=RN(L+8)
RL=RN(L)
JX=L
3 IF(RH.EQ.0)CALL SETP8(L,K,NA,NB)
C GO GET SPACE FOR P8 IF NONE THERE
XX=XX+RN(L+8)
C XX=TOTAL INCHES OF ALL FILES
1 CONTINUE
R2=R3/XX
C R2=FACTOR FOR CHANGES
R3=0
DO 2 K=1,NFCNT
NA=NFILE(K)
NB=NFILE(K+1)-1
2 CALL JUSTAV(NA,NB)
END
SUBROUTINE JUSTAV(NA,NB)
C ALWAYS ASSUMES BOTTOM STAFF IS STAFF #0
COMMON /JCHAR/IXX,ISEMI,IBLA
COMMON R2,JA,CN,J2,R3,R4,R5
CC COMMON R2,JA,CENTR,J2,R3 /ALFF/INP(1),J0,K0,RL,R4,R5,X,Y,NX
COMMON /ALFF/INP(1),J0,K0,RL,Q4,Q5,X,Y,NX
1 ,RN2,RN4,RN5,RSET,JX,JH,RH,NN,KK,JHX
1 /XRN/RN(1) /PTR/KWDS(1)
RSET=-1.0
CC100 IF(R3.EQ.0)GO TO 101
C IF R3.NE.0 = R3=SIZE WANTED, R2 IS THEN CREATED BY NEXT SECTION.
CC DO 60 K=NA,NB
CC JX=KWDS(K)
CC IF(RN(JX+1).NE.8.0)GO TO 60
CC IF(STAFFN(JX).NE.0)GO TO 60
CC IF(RN(JX).LT.6.0.OR.RN(JX+8).EQ.0)GO TO 60
C NOW WE'VE FOUND GIVEN SPACE IN INCHES
CC GO TO 61
CC60 CONTINUE
CC R2=1.0
CC RSET=0
C GO FIND TOP, THEN SCALE TO R3 SIZE
CC GO TO 101
CC61 R2=R3/RN(JX+8)
CC RSET=-1.0
101 J0=0
JX=0
DO 3 K=NA,NB
C NA,NB LIMITS SINGLE FILE WITHIN WHOLE PAGE.
L=KWDS(K)
IF(RN(L+1).NE.8)GO TO 3
RL=RN(L)
C WORDCOUNT
RN2=STAFFN(L)
RN4=0
IF(RL.GE.2.0)RN4=RN(L+4)
RN5=1.0
IF(RL.GE.3.0.AND.RN(L+5).NE.0)RN5=RN(L+5)
IF(RN2.NE.0)GO TO 30
J0=L
K0=K
JX=L
IF(RL.LT.6.0)GO TO 3
IF(R2.EQ.0.OR.R2.EQ.1.0)GO TO 3
IF(RN(L+8).EQ.0)GO TO 3
C JUMP OUT IF P8=0 OR JS=0 OR NOT ENOUGH PARAMS.
RN(L+8)=RN(L+8)*R2
J0=0
GO TO 3
30 IF(R2.NE.0)GO TO 4
C R2=0 MEANS SET P4 OF ALL STAVES TO 0
IF(RL.LT.2.0)GO TO 3
RN(L+4)=ST1000(RN4)
C PUTS HEIGHT TO 0. IF R4.GE.1000 STAFF MAY HAVE OTHER THAN 5 LINES.
CALL STFH(RN2,RN4,RN5)
GO TO 3
4 IF(RN2.EQ.0)GO TO 3
C SKIP NEXT IF BOTTOM STAFF (0)
IF(R2.EQ.1.0)GO TO 3
R4=0
X=AMOD(RN4,1000.)
RN4=RN4-X
C ALL THIS FOR P4=3088, FOR EXAMPLE (3-LINE STAFF)
IF(RL.GE.2.0)R4=X
C FOUND VERT. POS. OF STAFF
X=STAFFN(L)*17.6+R4*RN5
Y=X*R2
R4=RN4+R4+(Y-X)/RN5
5 RN(L+4)=R4
CALL STFH(RN2,R4,RN5)
3 CONTINUE
31 IF(J0.EQ.0)GO TO 200
CALL SETP8(J0,K0,NA,NB)
200 END
FUNCTION ST1000(R4)
ST1000=R4-AMOD(R4,1000.)
C ALL THESE AMODS ARE FOR STAFF PARAM 4 +n000 (LESS OR MORE THAN 5 LINES)
END
FUNCTION STAFFN(J)
COMMON /XRN/RN(1)
STAFFN=AMOD(RN(J+2),8.0)
END
SUBROUTINE STFH(RN2,RN4,RN5)
COMMON /POSI/STFF(0/7)
C SETS ABSOLUTE STAFF HEIGHT
IF(RN5.EQ.0)RN5=1.0
STFF(IFIX(RN2))=123.0*RN2-469.0+AMOD(RN4,1000.)*7.*RN5
END
SUBROUTINE STFHX(X,JH)
C FIND ABSOLUTE STAFF HEIGHT OF TOP 2 STAVES
COMMON /XRN/RN(1)
R4=0
IF(RN(JH).GE.2.0)R4=AMOD(RN(JH+4),1000.)
R5=1.0
IF(RN(JH).GE.3.0.AND.RN(JH+5).NE.0)R5=RN(JH+5)
X=STAFFN(JH)*17.6+R4*R5
CC X=RN(JH+2)*17.6+R4*R5
END
SUBROUTINE VERTX
COMMON R2,JA,CENTR,J2,R3
2 FORMAT(2F)
3 FORMAT(' TYPE VERTICAL SIZE IN INCHES -- '$)
TYPE 3
ACCEPT 2,R3
END
SUBROUTINE SETP8(J0,K0,NA,NB)
COMMON/XRN/ RN(1)/PTR/KWDS(1) /STF/RSTFAC(120),STFF(120)
COMMON R2,JA,CN,J2,R3,R4,R5
CC COMMON R2,JA,CENTR,J2,R3 /ALFF/INP(1),L0,M0,RL,R4,R5,X,Y,NX
COMMON /ALFF/INP(1),L0,M0,RL,Q4,Q5,X,Y,NX
1 ,RN2,RN4,RN5,RSET,JX,JH,RH,NN,KK,JHX,ISTF(0/7)
RL=RN(J0)
IF(R2.EQ.0.AND.RL.GE.2.0)RN(J0+4)=ST1000(RN(J0+4))
13 DO 17 K=0,7
17 ISTF(K)=0
C ISTF WILL HOLD POINTERS ALL STAVES IN THIS FILE
DO 14 K=NA,NB-1
CCC DO 14 K=NA,NB
L=KWDS(K)
IF(RN(L+1).NE.8)GO TO 14
C WHAT ABOUT INVISIBLE STAVES????*********
ISTF(IFIX(STAFFN(L)))=L
CC ISTF(IFIX(RN(L+2)))=L
14 CONTINUE
DO 18 K=7,0,-1
C FIND HIGHEST AND NEXT-TO-HIGHEST STAFF
IF(ISTF(K).EQ.0)GO TO 18
JH=ISTF(K)
JHX=0
C****** ALWAYS ASSUMES THERE REALLY IS A STAFF 0 **********
19 IF(K.EQ.0)GO TO 15
IF(ISTF(K-1).NE.0)GO TO 20
K=K-1
C THERE CAN BE GAPS IN STAFF NUMBERS (ASSUMES STAFF 0 EXISTS!)
GO TO 19
20 JHX=ISTF(K-1)
GO TO 15
18 CONTINUE
15 CALL STFHX(X,JH)
16 CALL STFHX(Y,JHX)
X=X+X-Y
IF(JHX.EQ.0)X=17.6
C 17.6=17.6+17.6-17.6 NEEDED IF THIS IS STAFF 0
RN(JX+8)=X/24.1
C SPACES ACCORDING TO SPACE BELOW TOP STAFF. 26.85 VERTICAL STEPS PER INCH
END
SUBROUTINE EXPND(JX,J,IX,ITEM)
COMMON/XRN/ RN(1) /PTR/KWDS(1)
C JX POINTS TO 1ST NEW ITEM
C J = NUM OF NEW ITEMS
C IX = NUM OF WDS ALREADY
C ITEM = NUM OF NEW WDS.
N=JX+J
C N POINTS TO 1 PAST END OF CURRENT RN ARRAY
LAST=IX+ITEM-1
K=JX
KK=IX-1
1 L=KWDS(K)+KK
IF(RN(L+1).EQ.8.0)GO TO 2
C LOOK FOR CODE 8
3 K=K+1
IF(K.LT.N)GO TO 1
RETURN
2 X=RN(L)
IF(X.GE.6.0)GO TO 3
C 6 = WD CNT IS BIG ENOUGH
IF(RN(L+2).EQ.0)GO TO 4
C JUMP IF THIS IS STAFF 0
IF(X.GE.2.0)GO TO 3
C 2 = WD CNT BIG ENOUGH TO PUT IN P4
Y=2.0
GO TO 5
4 Y=6.0
5 NN=Y-X
C DIFFERENCE BETWEEN WD CNT AND WHAT IS NEEDED.
RN(L)=Y
L=KWDS(K+1)+KK
DO 7 MM=LAST+NN,L,-1
C SHIFT DATA AHEAD BY NN WDS.
7 RN(MM)=RN(MM-NN)
DO 8 MM=L,L+NN-1
C ZERO OUT NEW PARAMS IN CODE 8
8 RN(MM)=0
DO 9 MM=K+1,N
C UPDATE POINTER LIST
9 KWDS(MM)=KWDS(MM)+NN
ITEM=ITEM+NN
LAST=LAST+NN
GO TO 3
END
SUBROUTINE ORDER(ITEM)
IMPLICIT INTEGER(A-Q,S-Z)
COMMON /PTR/PWDS(1) /XRN/RN(1)/RR4/P1,P2,NF
DIMENSION RST(1),WDS(1)
EQUIVALENCE (RST,RN(10001)),(WDS,PWDS(1251))
C****** CHANGE IF NOT ENOUGH STORAGE SPACE ************
J=1
JJ=1
K1=1
K2=ITEM
DO 40 K=0,NF*8-1
10 IF(K1.GT.K2)GO TO 45
C JUMP OUT IF ALL SORTED
M=0
RX=9999.
RK=K
DO 20 L=K1,K2
N=PWDS(L)
IF(N.LT.0)GO TO 20
C SKIP ITEM THAT WAS ALREADY SHUFFLED
IF(RK.NE.RN(N+2))GO TO 20
C ORDER BY STAVES
R=RN(N+3)
CCC IF(R.EQ.10000.)GO TO 20
C SKIP ITEM THAT WAS ALREADY SHUFFLED
IF(RN(N+1).EQ.16)GO TO 30
C DO NOT ORDER TEXT. (CODE 16)
IF(R.GE.RX)GO TO 20
RX=R
M=L
20 CONTINUE
IF(M.EQ.0)GO TO 40
C FOUND NO MORE ON THIS LINE
L=M
C NOW PUT AWAY NEXT ITEM IN ORDER
CC DO 3 MM=PWDS(L),PWDS(L+1)-1
CC RST(J)=RN(MM)
CC3 J=J+1
30 WDS(JJ)=J
JJ=JJ+1
M=PWDS(L)
MM=IABS(PWDS(L+1))-M
C NEXT MOVES RN INTO RST
CALL RLOOP(RST(J),RN(M),MM)
J=J+MM
CCCC RN(PWDS(L)+3)=10000.
C WIPE OUT THIS POSITION, MAKE POINTER NEG.
PWDS(L)=-M
IF(L.NE.K1)GO TO 50
C NOW CHECK IF BOT OR TOP OF ARRAY CAN BE SHORTENED
60 K1=K1+1
IF(PWDS(K1).EQ.0)GO TO 60
GO TO 10
50 IF(L.NE.K2)GO TO 10
70 K2=K2-1
IF(PWDS(K2).EQ.0)GO TO 70
GO TO 10
40 CONTINUE
45 CALL RLOOP(PWDS,WDS,ITEM)
C PUTS WDS INTO PWDS (NOT ITEM+1 SO LAST NUMBER IS NOT OVERWRITTEN.)
CC DO 6 K=1,PWDS(ITEM+1)
C AND RN ARRAY
CC6 RN(K)=RST(K+3)
CALL RLOOP(RN,RST,PWDS(ITEM+1))
C PUT RST BACK INTO RN
END